package com.chatplus.application.aiprocessor.channel.chat.xunfei;

import baidumodel.constant.ChatRoleConstant;
import com.chatplus.application.aiprocessor.provider.ChatAiProcessorServiceProvider;
import com.chatplus.application.aiprocessor.channel.chat.ChatAiProcessorService;
import com.chatplus.application.aiprocessor.channel.chat.xunfei.dto.XunFeiMsgDTO;
import com.chatplus.application.aiprocessor.channel.chat.xunfei.dto.XunFeiRequestDTO;
import com.chatplus.application.aiprocessor.handler.dto.ChatRecordMessage;
import com.chatplus.application.aiprocessor.listener.impl.XunFeiEventSourceListener;
import com.chatplus.application.common.logging.SouthernQuietLogger;
import com.chatplus.application.common.logging.SouthernQuietLoggerFactory;
import com.chatplus.application.enumeration.AiPlatformEnum;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.WebSocket;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;


/**
 * 讯飞 星火 机器人处理器
 *
 * @author chj
 * @date 2023/12/27
 **/
//@Service(value = ChatAiProcessorServiceProvider.SERVICE_NAME_PRE + "XunFei")
//public class XunFeiXhProcessor extends ChatAiProcessorService {
//    private static final SouthernQuietLogger LOGGER = SouthernQuietLoggerFactory.getLogger(XunFeiXhProcessor.class);
//    private final ObjectMapper objectMapper;
//
//    public XunFeiXhProcessor(ObjectMapper objectMapper) {
//        this.objectMapper = objectMapper;
//    }
//
//    private final Map<String, String> model2URL = Map.of(
//            "general", "v1.1",
//            "generalv2", "v2.1",
//            "generalv3", "v3.1"
//    );
//
//    @Override
//    public void processStream(List<ChatRecordMessage> messageContext) throws JsonProcessingException {
//        initConfig();
//        // 需要用竖线（|）将 APPID, APIKey 和 APISecret 按照顺序串接起来填入
//        String value = getApiKeyList().getFirst();
//        String appId = value.split("\\|")[0];
//        String apiKey = value.split("\\|")[1];
//        String secretKey = value.split("\\|")[2];
//        String modelName = getSession().getAttributes().get("modelName").toString();
//        String apiUrl = getApiUrl().replace("{version}", model2URL.get(modelName));
//        // 生成鉴权访问大模型的路径
//        String authUrl = getAuthUrl(apiUrl, apiKey, secretKey);
//        // 鉴权方法生成失败，直接返回 null
//        if (authUrl == null) {
//            replyMessage("鉴权方法生成失败，连接已关闭！！！");
//            return;
//        }
//        OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
//        // 将 https/http 连接替换为 ws/wss 连接
//        String url = authUrl.replace("http://", "ws://").replace("https://", "wss://");
//        Request request = new Request.Builder().url(url).build();
//        String prompt = messageContext.stream()
//                .filter(msg -> msg.getReply() == null)
//                .map(ChatRecordMessage::getPrompt)
//                .collect(Collectors.joining());
//        // 建立 wss 连接
//        WebSocket webSocket = okHttpClient.newWebSocket(request, new XunFeiEventSourceListener(getSession(), getChannel(), prompt));
//        // 组装请求参数
//        List<XunFeiMsgDTO> messages = new ArrayList<>();
//        AtomicInteger index = new AtomicInteger();
//        messageContext.forEach(msg -> {
//            XunFeiMsgDTO promptMessage = new XunFeiMsgDTO(ChatRoleConstant.USER, msg.getPrompt(), index.get());
//            index.getAndIncrement();
//            messages.add(promptMessage);
//            if (StringUtils.isNotEmpty(msg.getReply())) {
//                XunFeiMsgDTO replyMessage = new XunFeiMsgDTO(ChatRoleConstant.ASSISTANT, msg.getPrompt(), index.get());
//                messages.add(replyMessage);
//            }
//        });
//        XunFeiRequestDTO requestDTO = getRequestParam(messages, modelName, appId);
//        // 发送请求
//        webSocket.send(objectMapper.writeValueAsString(requestDTO));
//    }
//
//    @Override
//    public String processSync(List<ChatRecordMessage> messageContext) {
//        return null;
//    }
//
//    @Override
//    public AiPlatformEnum getChannel() {
//        return AiPlatformEnum.XUN_FEI;
//    }
//
//    @Override
//    public void stopChat(String sessionId) {
//
//    }
//
//    /**
//     * 生成鉴权方法，具体实现不用关心，这是讯飞官方定义的鉴权方式
//     *
//     * @return 鉴权访问大模型的路径
//     */
//    public String getAuthUrl(String authUrl, String apiKey, String apiSecret) {
//        try {
//            authUrl = authUrl.replace("ws://", "http://").replace("wss://", "https://");
//            URL url = new URL(authUrl);
//            // 时间
//            SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
//            format.setTimeZone(TimeZone.getTimeZone("GMT"));
//            String date = format.format(new Date());
//            // 拼接
//            String preStr = "host: " + url.getHost() + "\n" +
//                    "date: " + date + "\n" +
//                    "GET " + url.getPath() + " HTTP/1.1";
//            // SHA256加密
//            Mac mac = Mac.getInstance("hmacsha256");
//            SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "hmacsha256");
//            mac.init(spec);
//            byte[] hexDigits = mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8));
//            // Base64加密
//            String sha = Base64.getEncoder().encodeToString(hexDigits);
//            // 拼接
//            String authorizationOrigin = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);
//            // 拼接地址
//            HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().
//                    addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorizationOrigin.getBytes(StandardCharsets.UTF_8))).
//                    addQueryParameter("date", date).
//                    addQueryParameter("host", url.getHost()).
//                    build();
//            return httpUrl.toString();
//        } catch (Exception e) {
//            LOGGER.message("鉴权方法中发生错误").exception(e).error();
//            return null;
//        }
//    }
//
//    /**
//     * 获取请求参数
//     *
//     * @param msgList 发送给大模型的消息，可以包含上下文内容
//     * @return 请求DTO，该 DTO 转 json 字符串后生成的格式参考 resources/demo-json/domain.json
//     */
//    public XunFeiRequestDTO getRequestParam(List<XunFeiMsgDTO> msgList, String modelName, String appId) {
//        XunFeiRequestDTO requestDTO = new XunFeiRequestDTO();
//        requestDTO.setHeader(new XunFeiRequestDTO.HeaderDTO(appId, getSession().getAttributes().get("userId").toString()));
//        requestDTO.setParameter(new XunFeiRequestDTO.ParameterDTO(new XunFeiRequestDTO.ParameterDTO.ChatDTO(modelName
//                , getCommonSetting().getTemperature(), getCommonSetting().getMaxTokens())));
//        requestDTO.setPayload(new XunFeiRequestDTO.PayloadDTO(new XunFeiRequestDTO.PayloadDTO.MessageDTO(msgList)));
//        return requestDTO;
//    }
//}
